﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class OrdenCorteForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int OrdenCorteId
        {
            get { return ViewState["OrdenCorteId"] == null ? -1 : (int)ViewState["OrdenCorteId"]; }
            set { ViewState["OrdenCorteId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Detalle Seleccionado
        /// </summary>
        private int DetalleId
        {
            get { return Session["DetalleId"] == null ? -1 : (int)Session["DetalleId"]; }
            set { Session["DetalleId"] = value; }
        }

        /// <summary>
        /// Es el código del Estilo Seleccionado
        /// </summary>
        private int EstiloId
        {
            get { return Session["EstiloId"] == null ? -1 : (int)Session["EstiloId"]; }
            set { Session["EstiloId"] = value; }
        }

        /// <summary>
        /// Es el código del Tela Seleccionado
        /// </summary>
        private int TelaId
        {
            get { return Session["TelaId"] == null ? -1 : (int)Session["TelaId"]; }
            set { Session["TelaId"] = value; }
        }

        /// <summary>
        /// Es el código del EtiquetaId Seleccionado
        /// </summary>
        private int EtiquetaId
        {
            get { return Session["EtiquetaId"] == null ? -1 : (int)Session["EtiquetaId"]; }
            set { Session["EtiquetaId"] = value; }
        }

        /// <summary>
        /// Es el código del Color Seleccionado
        /// </summary>
        private int ColorId
        {
            get { return Session["ColorId"] == null ? -1 : (int)Session["ColorId"]; }
            set { Session["ColorId"] = value; }
        }

        /// <summary>
        /// Es el Total Proporcion
        /// </summary>
        private int TotalPorcion
        {
            get { return Session["TotalPorcion"] == null ? -1 : (int)Session["TotalPorcion"]; }
            set { Session["TotalPorcion"] = value; }
        }



        /// <summary>
        /// Listado de proporciones.
        /// </summary>
        private List<PR_OrdenCorteProporcion> ProporcionesTemp
        {
            get
            {
                return Session["ProporcionesTemp"] == null ? null : (List<PR_OrdenCorteProporcion>)Session["ProporcionesTemp"];
            }
            set
            {
                Session["ProporcionesTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de DistribucionesTemp.
        /// </summary>
        private List<PR_OrdenCorteDistribucion> DistribucionesTemp
        {
            get
            {
                return Session["DistribucionesTemp"] == null ? null : (List<PR_OrdenCorteDistribucion>)Session["DistribucionesTemp"];
            }
            set
            {
                Session["DistribucionesTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de PaquetesTemp.
        /// </summary>
        private List<PR_OrdenCortePaquete> PaquetesTemp
        {
            get
            {
                return Session["PaquetesTemp"] == null ? null : (List<PR_OrdenCortePaquete>)Session["PaquetesTemp"];
            }
            set
            {
                Session["PaquetesTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            try
            {              
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.OrdenCorte);
                    Master.AgregarBreadcrumb("Orden de Corte", "#", true);
                    Master.AgregarBreadcrumb("Listado", "OrdenCorteList.aspx", false);

                    int ordenCorte = 0;

                    if (Request.QueryString["OrdenCorteId"] != null && Int32.TryParse(Request.QueryString["OrdenCorteId"], out ordenCorte))
                    {
                        this.OrdenCorteId = ordenCorte;
                    }
                    else
                    {
                        this.OrdenCorteId = -1;
                    }
                    ProporcionesTemp = new List<PR_OrdenCorteProporcion>();
                    DistribucionesTemp = new List<PR_OrdenCorteDistribucion>();
                    PaquetesTemp = new List<PR_OrdenCortePaquete>();
                    EstablecerComportamiento();
                }               
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;
                        Master.AgregarBreadcrumb("Consultar", "#", false);
                        CargarOrdenCorte();
                        DeshabilitarControles();
                        btnGrabar.Visible = false;
                        break;
                    case (int)AccionesForm.Modificar:
                        this.Operacion = AccionesForm.Modificar;
                        Master.AgregarBreadcrumb("Modificar", "#", false);
                        CargarOrdenCorte();
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;
                        Master.AgregarBreadcrumb("Adicionar", "#", false);
                        txtFechaRegistro.Text = DateTime.Now.ToShortDateString();
                        CargarTelas();
                        CargarProporciones();
                        CargarDistribuciones();
                        CargarPaquetes();
                        break;
                }
            }
        }

        private void CargarOrdenCorte()
        {
            TablasDataContext database = new TablasDataContext();

            var ordenCorte = database.PR_OrdenCorte.FirstOrDefault(c => c.OrdCor_Id == this.OrdenCorteId);            

            txtCodigo.Text = (ordenCorte.OrdCor_Id).ToString("00000");
            OrdenProduccionSearch1.CodigoSeleccionado = ordenCorte.OrdPro_Id;
            OrdenProduccionSearch1.DescripcionSeleccionado = ordenCorte.PR_OrdenProduccion.OrdPro_Descripcion;
            OrdenProduccionSearch1.EstiloSeleccionado = ordenCorte.Estilo_Id;
            txtFechaRegistro.Text = ordenCorte.OrdCor_FechaRegistro.ToShortDateString();
            txtEstado.Text = ordenCorte.OrdCor_Estado == 'R' ? "REGISTRADO" : "FINALIZADO";
            txtEstilo.Text = ordenCorte.Estilo_Id.ToString("00000");
            txtPanos.Text = ordenCorte.OrdCor_Paños.ToString();
            txtReferencia.Text = ordenCorte.OrdCor_Referencia;
            this.EstiloId = ordenCorte.Estilo_Id;

            this.TelaId = ordenCorte.OrdCor_Tela_Id;
            this.EtiquetaId = ordenCorte.OrdCor_Combinacion_Id;
            this.ColorId = ordenCorte.OrdCor_Color_Id;

            CargarTelas();            

            ListarProporciones();
            CargarProporciones();
            ListarDistribuciones();
            CargarDistribuciones();
            ListarPaquetes();
            CargarPaquetes();
        }

        private void DeshabilitarControles()
        {
            txtReferencia.Enabled = false;
            ddlTela.Enabled = false;
            ddlEtiqueta.Enabled = false;
            ddlColor.Enabled = false;
            txtPanos.Enabled = false;

            gvProporciones.Columns[3].Visible = false;            
            gvDistribuciones.Columns[2].Visible = false;            

            lnkGenerar.Visible = false;
            lnkActualizarDistribuciones.Visible = false;
            lnkActualizarPaquetes.Visible = false;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("OrdenCorteList.aspx");
        }

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                case AccionesForm.Modificar:
                    Actualizar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Insertar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();

                //Cargar Cabecera.
                PR_OrdenCorte orden = new PR_OrdenCorte();
                orden.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                orden.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                orden.OrdCor_Estado = 'R';                
                orden.OrdCor_FechaRegistro = DateTime.Now.Date;
                orden.OrdCor_Tela_Id = Convert.ToInt32(ddlTela.SelectedValue);
                orden.OrdCor_Tela = ddlTela.SelectedItem.Text;
                orden.OrdCor_Combinacion_Id = Convert.ToInt32(ddlEtiqueta.SelectedValue);
                orden.OrdCor_Combinacion = ddlEtiqueta.SelectedItem.Text;
                orden.OrdCor_Color_Id = Convert.ToInt32(ddlColor.SelectedValue);
                orden.OrdCor_Color = ddlColor.SelectedItem.Text;
                orden.OrdCor_Referencia = txtReferencia.Text;
                orden.OrdCor_Paños = Convert.ToInt32(txtPanos.Text);



                orden.PR_OrdenCorteProporcion = new EntitySet<PR_OrdenCorteProporcion>();
                orden.PR_OrdenCorteDistribucion = new EntitySet<PR_OrdenCorteDistribucion>();
                orden.PR_OrdenCortePaquete = new EntitySet<PR_OrdenCortePaquete>();

                //Se carga el detalle.
                foreach (var proporcion in ProporcionesTemp)
                {
                    PR_OrdenCorteProporcion nuevoProporcion = new PR_OrdenCorteProporcion()
                    {
                        OrdCorPro_Cantidad = proporcion.OrdCorPro_Cantidad,
                        OrdCorPro_Secuencia = proporcion.OrdCorPro_Secuencia,
                        OrdCorPro_Talla = proporcion.OrdCorPro_Talla,
                        OrdCorPro_Talla_Id = proporcion.OrdCorPro_Talla_Id                       
                    };
                    orden.PR_OrdenCorteProporcion.Add(nuevoProporcion);
                }

                foreach (var distribucion in DistribucionesTemp)
                {
                    PR_OrdenCorteDistribucion nuevoDistribucion = new PR_OrdenCorteDistribucion()
                    {
                        OrdCorDis_Secuencia = distribucion.OrdCorDis_Secuencia,
                        OrdCorDis_Cantidad = distribucion.OrdCorDis_Cantidad 
                    };
                    orden.PR_OrdenCorteDistribucion.Add(nuevoDistribucion);
                }

                foreach (var paquete in PaquetesTemp)
                {
                    PR_OrdenCortePaquete nuevoPaquete = new PR_OrdenCortePaquete()
                    {
                       OrdCorPaq_Numero = paquete.OrdCorPaq_Numero,
                       OrdCorPaq_Prendas = paquete.OrdCorPaq_Prendas,
                       OrdCorPaq_Talla = paquete.OrdCorPaq_Talla,
                       Talla_Id = paquete.Talla_Id,
                       OrdCorPaq_Color = paquete.OrdCorPaq_Color
                    };
                    orden.PR_OrdenCortePaquete.Add(nuevoPaquete);
                }
                
                database.PR_OrdenCorte.InsertOnSubmit(orden);
                database.SubmitChanges();
                Response.Redirect("OrdenCorteList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void Actualizar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();
                database.DeferredLoadingEnabled = false;

                //Cargar Cabecera.
                PR_OrdenCorte orden = database.PR_OrdenCorte.FirstOrDefault(c => c.OrdCor_Id == this.OrdenCorteId);

                //Cargar Cabecera.                
                orden.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                orden.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                orden.OrdCor_Estado = 'R';
                orden.OrdCor_FechaRegistro = DateTime.Now.Date;
                orden.OrdCor_Tela_Id = Convert.ToInt32(ddlTela.SelectedValue);
                orden.OrdCor_Tela = ddlTela.SelectedItem.Text;
                orden.OrdCor_Combinacion_Id = Convert.ToInt32(ddlEtiqueta.SelectedValue);
                orden.OrdCor_Combinacion = ddlEtiqueta.SelectedItem.Text;
                orden.OrdCor_Color_Id = Convert.ToInt32(ddlColor.SelectedValue);
                orden.OrdCor_Color = ddlColor.SelectedItem.Text;
                orden.OrdCor_Referencia = txtReferencia.Text;
                orden.OrdCor_Paños = Convert.ToInt32(txtPanos.Text);

                //Se eliminan los detalles

                var paquetes = (from cortePaquetes in database.PR_OrdenCortePaquete
                               where cortePaquetes.OrdCor_Id == this.OrdenCorteId
                               select cortePaquetes);
                foreach (var item in paquetes)
                {
                    database.PR_OrdenCortePaquete.DeleteOnSubmit(item);
                }

                var distribuciones = (from corteDistribucion in database.PR_OrdenCorteDistribucion
                                where corteDistribucion.OrdCor_Id == this.OrdenCorteId
                                select corteDistribucion);
                foreach (var item in distribuciones)
                {
                    database.PR_OrdenCorteDistribucion.DeleteOnSubmit(item);
                }

                var proporciones = (from cortePaquetes in database.PR_OrdenCorteProporcion
                                    where cortePaquetes.OrdCor_Id == this.OrdenCorteId
                                    select cortePaquetes);
                foreach (var item in proporciones)
                {
                    database.PR_OrdenCorteProporcion.DeleteOnSubmit(item);
                }  

                //Se carga el detalle.
                foreach (var proporcion in ProporcionesTemp)
                {
                    PR_OrdenCorteProporcion nuevoProporcion = new PR_OrdenCorteProporcion()
                    {
                        OrdCorPro_Cantidad = proporcion.OrdCorPro_Cantidad,
                        OrdCorPro_Secuencia = proporcion.OrdCorPro_Secuencia,
                        OrdCorPro_Talla = proporcion.OrdCorPro_Talla,
                        OrdCorPro_Talla_Id = proporcion.OrdCorPro_Talla_Id
                    };
                    orden.PR_OrdenCorteProporcion.Add(nuevoProporcion);
                }

                foreach (var distribucion in DistribucionesTemp)
                {
                    PR_OrdenCorteDistribucion nuevoDistribucion = new PR_OrdenCorteDistribucion()
                    {
                        OrdCorDis_Secuencia = distribucion.OrdCorDis_Secuencia,
                        OrdCorDis_Cantidad = distribucion.OrdCorDis_Cantidad
                    };
                    orden.PR_OrdenCorteDistribucion.Add(nuevoDistribucion);
                }

                foreach (var paquete in PaquetesTemp)
                {
                    PR_OrdenCortePaquete nuevoPaquete = new PR_OrdenCortePaquete()
                    {
                        OrdCorPaq_Numero = paquete.OrdCorPaq_Numero,
                        OrdCorPaq_Prendas = paquete.OrdCorPaq_Prendas,
                        OrdCorPaq_Talla = paquete.OrdCorPaq_Talla,
                        Talla_Id = paquete.Talla_Id,
                        OrdCorPaq_Color = paquete.OrdCorPaq_Color
                    };
                    orden.PR_OrdenCortePaquete.Add(nuevoPaquete);
                }

                database.SubmitChanges();
                Response.Redirect("OrdenCorteList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private string ValidaDatos()
        {
            string strResultado = string.Empty;

            if (DistribucionesTemp.Count == 0)            
                return "Ingrese distribuciones";
            if (ProporcionesTemp.Count == 0)
                return "Ingrese proporciones";
            if (PaquetesTemp.Count == 0)
                return "Ingrese paquetes";

            CargarDistribuciones();
            CargarPaquetes();

            if(Convert.ToInt32(txtNroPanosPaquetes.Text) != Convert.ToInt32(txtTotalDistribucion.Text))
            {
                return "Número de paños es diferente a la distribución total";
            }

            if (Convert.ToInt32(txtPrendasProducir.Text) != Convert.ToInt32(txtTotalPrendas.Text))
            {
                return "Prendas a producir es diferente a la total de prendas";
            }

            return string.Empty;
        }

        #region Dataos Generales

        protected void OrdenProduccionSearch_Seleccionado(object sender, EventArgs e)
        {
            txtEstilo.Text = OrdenProduccionSearch1.EstiloSeleccionado.ToString("00000");
            this.EstiloId = OrdenProduccionSearch1.EstiloSeleccionado;

            CargarTelas();
        }

        private void CargarTelas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Tela> lstTela = new List<TG_Tela>();
            
            int varianteId = 0;
            var ordenProduccion = database.PR_OrdenProduccion.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado);
            if (ordenProduccion != null) varianteId = ordenProduccion.Variante_Id;

            var listVariantesTelas = (from varianteItem in database.DE_VarianteItem
                                      where varianteItem.DE_VarianteComponente.DE_Variante.Estilo_Id == this.EstiloId
                                         && varianteItem.Variante_Id == varianteId
                                         && varianteItem.Tela_Id != null
                                      select varianteItem.TG_Tela);

            foreach (var item in listVariantesTelas)
                if (!lstTela.Exists(c => c.Tela_Id == item.Tela_Id)) lstTela.Add(item);


            ddlTela.DataSource = lstTela;
            ddlTela.DataValueField = "Tela_Id";
            ddlTela.DataTextField = "Tela_Descripcion";
            ddlTela.DataBind();
            ddlTela.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            if (this.TelaId > 0 && !this.IsPostBack)
                ddlTela.SelectedValue = this.TelaId.ToString();
            else
                ddlTela.SelectedValue = "0";

            ddlTela_SelectedIndexChanged(null, null);
        }

        protected void ddlTela_SelectedIndexChanged(object sender, EventArgs e)
        {
            ProporcionesTemp.Clear();
            DistribucionesTemp.Clear();
            PaquetesTemp.Clear();
            CargarEtiquetas();
        }

        protected void ddlEtiqueta_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarColores();
            CargarProporciones();
            CargarDistribuciones();
            CargarPaquetes();
        }

        private void CargarEtiquetas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Combinacion> lstCombinacion = new List<TG_Combinacion>();

            int varianteId = 0;
            var ordenProduccion = database.PR_OrdenProduccion.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado);
            if (ordenProduccion != null) varianteId = ordenProduccion.Variante_Id;

            var listCombinacionColor = (from varianteItem in database.DE_VarianteItemCombinacionColor
                                        where varianteItem.DE_VarianteItem.Tela_Id == Convert.ToInt32(ddlTela.SelectedValue)
                                        && varianteItem.Variante_Id == varianteId
                                        select varianteItem.TG_CombinacionColor);

            foreach (var item in listCombinacionColor)
                if (!lstCombinacion.Exists(c => c.Combinacion_Id == item.Combinacion_Id)) lstCombinacion.Add(item.TG_Combinacion);

            ddlEtiqueta.DataSource = lstCombinacion;
            ddlEtiqueta.DataValueField = "Combinacion_Id";
            ddlEtiqueta.DataTextField = "Combinacion_Descripcion";
            ddlEtiqueta.DataBind();
            ddlEtiqueta.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            if (this.EtiquetaId > 0 && !this.IsPostBack)
                ddlEtiqueta.SelectedValue = this.EtiquetaId.ToString();
            else
                ddlEtiqueta.SelectedValue = "0";

            ddlEtiqueta_SelectedIndexChanged(null, null);
        }

        private void CargarColores()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Color> lstCombinacion = new List<TG_Color>();

            int varianteId = 0;
            var ordenProduccion = database.PR_OrdenProduccion.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado);
            if (ordenProduccion != null) varianteId = ordenProduccion.Variante_Id;

            var listCombinacionColor = (from varianteItem in database.DE_VarianteItemCombinacionColor
                                        where varianteItem.DE_VarianteItem.Tela_Id == Convert.ToInt32(ddlTela.SelectedValue)
                                           && varianteItem.TG_CombinacionColor.Combinacion_Id == Convert.ToInt32(ddlEtiqueta.SelectedValue)
                                           && varianteItem.Variante_Id == varianteId
                                        select varianteItem.TG_CombinacionColor);

            foreach (var item in listCombinacionColor)
                if (!lstCombinacion.Exists(c => c.Color_Id == item.Color_Id)) lstCombinacion.Add(item.TG_Color);

            ddlColor.DataSource = lstCombinacion;
            ddlColor.DataValueField = "Color_Id";
            ddlColor.DataTextField = "Color_Descripcion";
            ddlColor.DataBind();
            ddlColor.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            if (this.ColorId > 0 && !this.IsPostBack)
                ddlColor.SelectedValue = this.ColorId.ToString();
            else
                ddlColor.SelectedValue = "0";
        }

        #endregion

        #region Proporciones

        protected void gvProporciones_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {
                    DropDownList ddlTallaNew = (DropDownList)gvProporciones.FooterRow.FindControl("ddlTallaNew");
                    TextBox txtProporcionNew = (TextBox)gvProporciones.FooterRow.FindControl("txtProporcionNew");
                                        
                    int? proporcion = string.IsNullOrEmpty(txtProporcionNew.Text) ? (int?)null : Convert.ToInt32(txtProporcionNew.Text);

                    if (ProporcionesTemp.Exists(c => c.OrdCorPro_Talla_Id == Convert.ToInt32(ddlTallaNew.SelectedValue)))
                    {
                        lblWarningMessage.Text = "Talla seleccionada ya en el listado";
                        warningMessage.Visible = true;
                        return;
                    }

                    ProporcionesTemp.Add(new PR_OrdenCorteProporcion()
                    {
                        OrdCorPro_Secuencia = ProporcionesTemp.Count + 1,
                        OrdCorPro_Talla_Id = Convert.ToInt32(ddlTallaNew.SelectedValue),
                        OrdCorPro_Talla = ddlTallaNew.SelectedItem.Text,
                        OrdCorPro_Cantidad = proporcion.Value
                    });

                    CargarProporciones();
                    CargarDistribuciones();
                    PaquetesTemp.Clear();
                    CargarPaquetes();
                }              
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvProporciones_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int secuencia = Convert.ToInt32(e.Keys["OrdCorPro_Secuencia"]);
                var proporcion = ProporcionesTemp.Find(c => c.OrdCorPro_Secuencia == secuencia);                

                ProporcionesTemp.Remove(proporcion);
                for (int i = 0; i < ProporcionesTemp.Count; i++)
                    ProporcionesTemp[i].OrdCorPro_Secuencia = i + 1;

                CargarProporciones();
                CargarDistribuciones();
                PaquetesTemp.Clear();
                CargarPaquetes();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        private void ListarProporciones()
        {
            TablasDataContext database = new TablasDataContext();

            var listaProporciones = from proporciones in database.PR_OrdenCorteProporcion
                                    where proporciones.OrdCor_Id == this.OrdenCorteId
                                    select proporciones;

            ProporcionesTemp = listaProporciones.ToList();
        }

        private void CargarProporciones()
        {
            if (ProporcionesTemp.Count() > 0)
            {
                gvProporciones.DataSource = ProporcionesTemp;
                gvProporciones.DataBind();

                this.TotalPorcion = ProporcionesTemp.Sum(c => c.OrdCorPro_Cantidad);
            }
            else
            {
                gvProporciones.DataSource = new List<PR_OrdenCorteProporcion>() { new PR_OrdenCorteProporcion() };
                gvProporciones.DataBind();
                gvProporciones.SelectedIndex = -1;
               
                for (int i = 0; i < gvProporciones.Rows[0].Cells.Count; i++)
                {
                    gvProporciones.Rows[0].Cells[i].Text = "";
                }
            }

            if(Request.QueryString["process"] == null)
                CargarTallas();
        }

        /// <summary>
        /// Llena la lista de países en el grid de direcciones.
        /// </summary>
        private void CargarTallas()
        {
            TablasDataContext database = new TablasDataContext();

            List<TG_Talla> lstTallas = new List<TG_Talla>();
            var listarQuery = from tallas in database.PR_OrdenProduccionDetalle
                              where tallas.OrdProDet_Color.ToUpper() == ddlEtiqueta.SelectedItem.Text.ToUpper()
                              && tallas.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                              select tallas;

            foreach (var item in listarQuery)
                if (!lstTallas.Exists(c => c.Talla_Id == item.Talla_Id)) 
                {
                    lstTallas.Add(new TG_Talla()
                    {
                        Talla_Id = item.Talla_Id.Value,
                        Talla_DescripcionCorta = item.OrdProDet_Talla
                    });                    
                }


            DropDownList ddlTallaNew = ((DropDownList)gvProporciones.FooterRow.FindControl("ddlTallaNew"));
            ddlTallaNew.DataSource = lstTallas.ToList();
            ddlTallaNew.DataValueField = "Talla_Id";
            ddlTallaNew.DataTextField = "Talla_DescripcionCorta";
            ddlTallaNew.DataBind();
            ddlTallaNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlTallaNew.SelectedValue = "0";
        }

        #endregion

        #region Distribuciones

        protected void gvDistribuciones_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int secuencia = Convert.ToInt32(e.Keys["OrdCorDis_Secuencia"]);
                var distribucion = DistribucionesTemp.Find(c => c.OrdCorDis_Secuencia == secuencia);

                DistribucionesTemp.Remove(distribucion);
                for (int i = 0; i < DistribucionesTemp.Count; i++)
                    DistribucionesTemp[i].OrdCorDis_Secuencia = i + 1;

                CargarDistribuciones();
                PaquetesTemp.Clear();
                CargarPaquetes();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvDistribuciones_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {                    
                    TextBox txtCantidadNew = (TextBox)gvDistribuciones.FooterRow.FindControl("txtCantidadNew");

                    int? cantidad = string.IsNullOrEmpty(txtCantidadNew.Text) ? (int?)null : Convert.ToInt32(txtCantidadNew.Text);

                    DistribucionesTemp.Add(new PR_OrdenCorteDistribucion()
                    {
                        OrdCorDis_Secuencia = DistribucionesTemp.Count + 1,
                        OrdCorDis_Cantidad = cantidad.Value                       
                    });

                    CargarProporciones();
                    CargarDistribuciones();
                    PaquetesTemp.Clear();
                    CargarPaquetes();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        private void ListarDistribuciones()
        {
            TablasDataContext database = new TablasDataContext();

            var listaDistribuciones = from Distribuciones in database.PR_OrdenCorteDistribucion
                                    where Distribuciones.OrdCor_Id == this.OrdenCorteId
                                    select Distribuciones;

            DistribucionesTemp = listaDistribuciones.ToList();
        }

        private void CargarDistribuciones()
        {
            if (DistribucionesTemp.Count() > 0)
            {
                gvDistribuciones.DataSource = DistribucionesTemp;
                gvDistribuciones.DataBind();

                txtTotalDistribucion.Text = DistribucionesTemp.Sum(c=>c.OrdCorDis_Cantidad).ToString();
            }
            else
            {
                gvDistribuciones.DataSource = new List<PR_OrdenCorteDistribucion>() { new PR_OrdenCorteDistribucion() };
                gvDistribuciones.DataBind();
                gvDistribuciones.SelectedIndex = -1;                
                for (int i = 0; i < gvDistribuciones.Rows[0].Cells.Count; i++)
                {
                    gvDistribuciones.Rows[0].Cells[i].Text = "";
                }

                txtTotalDistribucion.Text = string.Empty;
            }
            txtNroPanosPaquetes.Text = txtPanos.Text;
        }

        #endregion


        #region Distribuciones

        private void ListarPaquetes()
        {
            TablasDataContext database = new TablasDataContext();

            var listaPaquetes = from paquetes in database.PR_OrdenCortePaquete
                                      where paquetes.OrdCor_Id == this.OrdenCorteId
                                      select paquetes;

            PaquetesTemp = listaPaquetes.ToList();
        }

        private void CargarPaquetes()
        {
            if (PaquetesTemp.Count() > 0)
            {
                gvPaquetes.DataSource = PaquetesTemp;
                gvPaquetes.DataBind();
                txtTotalPaquetes.Text = PaquetesTemp.Count().ToString();
                if(txtPanos.Text != string.Empty && txtTotalDistribucion.Text != string.Empty)
                    txtPrendasProducir.Text = (this.TotalPorcion * Convert.ToInt32(txtTotalDistribucion.Text)).ToString();
                txtTotalPrendas.Text = PaquetesTemp.Sum(c => c.OrdCorPaq_Prendas).ToString();
            }
            else
            {
                gvPaquetes.DataSource = new List<PR_OrdenCortePaquete>() { new PR_OrdenCortePaquete() };
                gvPaquetes.DataBind();
                gvPaquetes.SelectedIndex = -1;
                for (int i = 0; i < gvPaquetes.Rows[0].Cells.Count; i++)
                {
                    gvPaquetes.Rows[0].Cells[i].Text = "";
                }

                txtTotalPaquetes.Text = string.Empty;
                txtPrendasProducir.Text = string.Empty;
                txtTotalPrendas.Text = string.Empty;
            }
        }

        protected void lnkGenerar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ProporcionesTemp.Count == 0)
                {
                    lblWarningMessage.Text = "Ingrese Proporciones";
                    warningMessage.Visible = true;
                    return;
                }

                if (DistribucionesTemp.Count == 0)
                {
                    lblWarningMessage.Text = "Ingrese Distribuciones";
                    warningMessage.Visible = true;
                    return;
                }

                PaquetesTemp.Clear();

                foreach (var proporcion in ProporcionesTemp)
                {
                    for (int i = 1; i <= proporcion.OrdCorPro_Cantidad; i++)
                    {
                        foreach (var distribucion in DistribucionesTemp)
                        {
                            PaquetesTemp.Add(new PR_OrdenCortePaquete()
                            {
                                OrdCorPaq_Numero = PaquetesTemp.Count +1,
                                Talla_Id = proporcion.OrdCorPro_Talla_Id,
                                OrdCorPaq_Prendas = distribucion.OrdCorDis_Cantidad,
                                OrdCorPaq_Talla = proporcion.OrdCorPro_Talla,
                                OrdCorPaq_Color = ddlColor.SelectedItem.Text 
                            });
                        }
                    }
                }

                CargarPaquetes();

            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        #endregion      

        protected void lnkActualizarDistribuciones_Click(object sender, EventArgs e)
        {
            CargarDistribuciones();
        }

        protected void lnkActualizarPaquetes_Click(object sender, EventArgs e)
        {
            CargarPaquetes();
        }
        

        private void ActualizarSeleccionGrilla(GridView gv)
        {
            if (gv.SelectedIndex > -1)
                foreach (GridViewRow row in gv.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gv.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }


        [WebMethod]
        public static void ActualizarProporcion(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                OrdenCorteForm pagina = new OrdenCorteForm();
                var proporciones = (List<Emporium_Web.DBML.PR_OrdenCorteProporcion>)pagina.Session["ProporcionesTemp"];

                var proporcion = proporciones.Find(c => c.OrdCorPro_Secuencia == id);
                proporcion.OrdCorPro_Cantidad = Convert.ToInt32(cantidad);                
            }
        }

        [WebMethod]
        public static void ActualizarCantidad(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                OrdenCorteForm pagina = new OrdenCorteForm();
                var distribuciones = (List<Emporium_Web.DBML.PR_OrdenCorteDistribucion>)pagina.Session["DistribucionesTemp"];

                var distribucion = distribuciones.Find(c => c.OrdCorDis_Secuencia == id);
                distribucion.OrdCorDis_Cantidad = Convert.ToInt32(cantidad);                
            }
        }

        [WebMethod]
        public static void ActualizarPrendas(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                OrdenCorteForm pagina = new OrdenCorteForm();
                var paquetes = (List<Emporium_Web.DBML.PR_OrdenCortePaquete>)pagina.Session["PaquetesTemp"];

                var paquete = paquetes.Find(c => c.OrdCorPaq_Numero == id);
                paquete.OrdCorPaq_Prendas = Convert.ToInt32(cantidad);              
            }
        }       
        
    }
}